Enunciado

Bienvenidos a la Actividad 1, donde pondremos en práctica todo lo aprendido durante el bloque 2. Esta actividad la realizaremos en clase, se terminará en casa (debería completarse en clase) y se entregará el día 8 de octubre.

¿En qué consiste?

Vamos a poner en práctica cuatro aspectos del procesamiento de imágenes:

La finalidad es sencilla. Se os dará una imagen, a color, que tiene varias tonalidades y que está pintada con círculos.

La actividad consiste en contar el número de círculos de la imagen. image.png

Evaluación

Se evaluará de la siguiente manera:

Formato de entrega

No se aceptará el formato .ipynb Habilitaré una actividad en Canvas para que podáis subir ambos archivos.

Inicialización

En primer lugar, cargamos todos los paquetes/frameworks que nos van a hacer falta. Se recomienda visitar la web: https://scikit-image.org/ para ver todas las funcionalidades que permite Scikit Image.

Cargar la imagen

Lo primero de todo, vamos a leer la imagen. Recuerda que hay que subir la imagen cada vez que inicies sesión en el notebook y que la ruta se mira haciendo botón derecho sobre el archivo.

Con lo cual, aquí vamos a hacer dos cosas:

Hacemos esto para luego posteriormente umbralizar la imagen en escala de grises.

Umbralizar la imagen con varios métodos

Vamos a probar ahora diferentes métodos para umbralizar la imagen. Se pide en esta actividad:

Aqui podemos observar los 4 tipos de umbralizaciones que hemos aplicado a nuestra imagen en escala de grises. Como podemos ver, la umbralización local es la peor, toda la imagen se vuelve completamente negra. Va seguida de la Otsu. Tanto Niblack como Sauvola estan bastante bien pero personalmente opino que se diferencian mejor los puntos en la Niblack al haber algo mas de espacio entre ellos y sobre todo es algo que se puede ver en el sol.

Morfología Matemática

Como se puede apreciar en la imagen hay varios elementos imperfectos:

Mediante el uso de morfología matemática (concretamente los cuatro operadores visto en clase) y los posibles elementos estructurales existentes, se pide:

Tras haber aplicado todos los elementos estructurales y todos los tipos de morfología matemática a la imagen, podemos llegar a la conclusión de que la mejor morfología matemática para distinguir los círculos será la erosión, mientras que el mejor elemento estructural será el disco o el diamante, la verdad no lo tengo claro entre ambos pero creo que escogería los discos. Como vemos, para el disco hemos utilizado un tamaño de "1" ya que si escogemos un valor mayor, empezaremos a cargarnos los círculos y eso no nos interesa.

Aquí he intentado juntar en una imagen lo que para mi son el mejor elemento junto con la mejor morfología pero no hay manera de que se vea bien y en grande.

Contando círculos

Haciendo uso de las funcionalidades cargadas al principio, se pide hacer una función que:

Por último, ¿qué se podría hacer para asegurar que no se tienen en cuenta posibles errores en la umbralización como pequeños puntos o posible ruido que haya llegado hasta este punto?

En este caso para mostrar la función de contar círculos lo he hecho 3 veces con distintas variantes para ver como cambiaba el numero de circulos. En el caso del Niblack y el Disk he usado el mismo codigo, para el segundo caso he usado otro distinto. Para el primer y tercer codigo como ya he dicho he usado lo mismo y podemos ver que en el caso de la imagen únicamente con Niblack tenemos más círculos que para la imagen unicamente con discos. Aún así me resulta extraño que las imagenes niblack y disk son prácticamente iguales por lo que creo que debe de tratarse de algun error. En el segundo caso he utilizado otro código distinto y lo que he hecho es abrir directamente la imagen original que no es binaria, para comprobar que me saliese por pantalla que "la imagen no es binaria".

(Bonus) Automatizamos el proceso de extracción

Esta sección no es obligatoria pero la pongo para aquellos que quieran saber "¿y ahora qué se haría?".

Lo que hemos hecho hasta ahora es:

Es decir, tenemos varios parámetros y tenemos una función que nos dice cuál es el número de puntos dada una imagen. Variando dichos parámetros, variará también el número de puntos, pero no parece haber una relación directa.

También no hay que olvidar que desconocemos el número de puntos (nunca se ha dicho, aunque siempre puedes contarlos), por lo que no podemos seguir un proceso de aprendizaje supervisado (tipo descenso del gradiente sobre los parámetros anteriores para encontrar el mejor resultado).

Pero lo que sí podemos hacer es iterar el valor de los parámetros para alcanzar un máximo de puntos (asumiendo que dicho máximo corresponderá con el mejor resultado). Esto suele hacerse cuando no sabemos exáctamente el resultado que esperamos.

En definitiva, ahora se buscaría realizar un proceso iterativo para encontrar el valor máximo del número de puntos. Para ello haría falta:

Podría decirse que esa combinación de parámetros es la mejor.